@TOC
JS的解构很灵活,参考
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
列表解构
1 | var parts = ['shoulder', 'knees']; |
参数解构
1 | let arr = [1, 2] |
数组解构
JS的数组解构非常强大1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35const arr = [100,200,300];
let [x,y,z] = arr;
console.log(1,x,y,z);
// 丢弃
const [,b,] = arr;
console.log(2,b);
//b = 5 // 异常,b声明为const
// 少于数组元素
const [d,e] = arr;
console.log(3,d,e);
// 多于数组元素
const [m,n,o,p] = arr
console.log(4,m,n,o,p);
// 可变变量
const [f,...args] = arr
console.log(5,f);
console.log(5,args);
// 支持默认值
const [j=1,k,,,l=10] = arr
console.log(j,k,l);
/* 执行结果
1 100 200 300
2 200
3 100 200
4 100 200 300 undefined
5 100
5 [ 200, 300 ]
100 200 10
*/
解构的时候,变量从左到右和元素对齐,可变参数放到最右边
能对应到数据就返回数据,对应不到数据的返回默认值,如果没有默认值返回undefined
对象解构
简单对象解构,非常有用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17const obj = {
a: 100,
b: 200,
c: 300
}
var {x, y, z} = obj;
console.log(x, y, z); // undefined undefined undefined
var {a, b, c} = obj; // key名称
console.log(a, b, c); // 100 200 300
var {a: m, b: n, c} = obj; // 重命名
console.log(m, n, c); // 100 200 300
var {a: M, c: N, d: D = 'python'} = obj; //缺省值
console.log(M, N, D); // 100 300 'python'
解构时,需要提供对象的属性名,会根据属性名找到对应的值。没有找到的返回缺省值,没有缺省值则返回undefined
复杂解构
嵌套数组
1 | const arr = [1, [2, 3], 4]; |
对象
1 | var data = { |
数组的操作
方法 | 描述 |
---|---|
push(…items) | 尾部增加多个元素 |
pop() | 移除最后一个元素,并返回它 |
map | 引入处理函数来处理数组中每一个元素,返回新的数组 |
filter | 引入处理函数处理数组中每一个元素,此处理函数返回true的元素保留,否则该元素被过滤掉,保留的元素构成新的数组返回 |
foreach | 迭代所有元素,无返回值 |
1 | const arr = [1, 2, 3, 4, 5]; |
- forEach用索引
第一个参数是值
第二个参数是索引
1 |
|
数组练习
有一个数组 const arr = [1, 2, 3, 4, 5];
,要求算出所有元素平方值,且输出平方值是偶数且大于10的平方值
效率偏差
1
2const arr = [1, 2, 3, 4, 5]
console.log(arr.map(x => x * x).filter(x => x % 2 === 0).filter(x => x > 10));应该先过滤,再求值比较好
1
2
3
4
5
6
7
8
9
10
11
12
13
14const arr = [1, 2, 3, 4, 5]
// 1
console.log(arr.filter(x => x % 2 === 0).map(x => x * x).filter(x => x > 10)); // 先过滤减少迭代次数
// 2
s = Math.sqrt(10) // 10开方算一次
console.log(arr.filter(x => x > s && !(x % 2)).map(x => x * x))
// 3
let newarr = []
arr.forEach(x => {
if (x > s && !(x % 2)) newarr.push(x * x);
})
console.log(newarr);
对象的操作
Object的静态方法 | 描述 |
---|---|
Object.keys(obj) | ES5开始支持。返回所有key |
Object.values(obj) | 返回所有值,试验阶段,支持较差 |
Object.entries(obj) | 返回所有值,试验阶段,支持较差 |
Object.assign(target, …sources) | 使用多个source对象,来填充target对象,返回target对象 第一参数是目标往往不说明,大部分赋值都是浅拷贝 有重复的,后面的覆盖前面的 |
1 | const obj = { |